package com.community.backend.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(exp)
                .setIssuedAt(new Date())
                .signWith(generalKey(secretKey), Jwts.SIG.HS256) // 明确 HS256
                .compact();
    }

    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        try {
            return Jwts.parser()
                    .verifyWith(generalKey(secretKey))
                    .build()
                    .parseSignedClaims(token)   // 明确解析 HS256
                    .getPayload();
        } catch (ExpiredJwtException e) {
            throw new RuntimeException("Token 已过期");
        } catch (JwtException e) {
            throw new RuntimeException("Token 非法");
        }
    }
    private static SecretKey generalKey(String secret) {
        // 密钥长度 ≥ 32 字节（256 bit）
        return Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secret));
    }
}
